package vue;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import controleur.EnregistrerCommande;
import controleur.EnregistrerRestaurants;

import modele.Commande;
import modele.ItemMenu;
import modele.ItemDansCommande;

import modele.Restaurant;

public class Panneau_Client extends JPanel implements Observer {
	
	private JPanel sectionPlat;
		private JPanel sectionListePlats;
		private JList listePlats;
		private JPanel sectionListePlatsSelectionnes;
		private JList listePlatsSelectionnes;
	private JPanel sectionAdresse;
		private JTextField textFieldAdresse;
	private JPanel sectionDateHeure;
		private JComboBox comboHeure;
		private JComboBox comboDate;
	private JPanel sectionConfirmation;
	private Restaurant restaurantSelectionne;
	
	/**
	 * Constructeur
	 * @param dimension - Dimension
	 * @param adresse - String
	 */
	public Panneau_Client(Dimension dimension, String adresse) {
		this.setSize(dimension);
		this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
		
		// Ajout de la section des restaurants
		final JPanel sectionBoutonRestaurant = new JPanel(new FlowLayout());
			// Ajout des boutons de chaque restaurant
		for (final Restaurant restaurant : EnregistrerRestaurants.getListeRestaurants()) {
			restaurant.addObserver((Observer) this);
			JButton boutonRestaurant = new JButton(restaurant.getNom());
			boutonRestaurant.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					restaurantSelectionne = restaurant;
					afficherPlats(restaurant);
				}
			});
			sectionBoutonRestaurant.add(boutonRestaurant);
		}
			// Fin de l'ajout des boutons de chaque restaurant
		// Ajout des sections par défaut
		sectionPlat = new JPanel();
		sectionPlat.setLayout(new BoxLayout(sectionPlat, BoxLayout.LINE_AXIS));
			sectionListePlatsSelectionnes = new JPanel(new GridLayout());
		sectionAdresse = new JPanel();
		sectionAdresse.setLayout(new BoxLayout(sectionAdresse, BoxLayout.LINE_AXIS));
			textFieldAdresse = new JTextField(adresse);
		sectionDateHeure = new JPanel();
		sectionDateHeure.setLayout(new BoxLayout(sectionDateHeure, BoxLayout.LINE_AXIS));
			Vector<String> listeHeures = new Vector<String>();
			for (int nbHeures=0; nbHeures<24; nbHeures++) {
				for (int nbMinutes=0; nbMinutes<2; nbMinutes++) {
					String nbMin = nbMinutes*30+"";
					if (nbMin.length() == 1) {
						nbMin += "0";
					}
					String nbHeu = nbHeures+"";
					if (nbHeu.length() == 1) {
						nbHeu = "0"+nbHeu;
					}
					listeHeures.add(nbHeu+":"+nbMin);
				}
			}
			comboHeure = new JComboBox(listeHeures);
			
			Date date = new Date();
			Vector<String> listeDates = new Vector<String>();
			for (int nbJours=0; nbJours<7; nbJours++) {
				listeDates.add(date.getDate()+nbJours+"/"+(date.getMonth()+1)+"/"+(date.getYear()+1900));
			}
			comboDate = new JComboBox(listeDates);
		sectionConfirmation = new JPanel();
		
		this.add(sectionBoutonRestaurant);
		// Fin de l'ajout de la section des restaurants
		this.add(sectionPlat);
		this.add(sectionAdresse);
		this.add(sectionDateHeure);
		this.add(sectionConfirmation);
	}
	
	/**
	 * Affiche les composants pour faire une commande ainsi que les plats du restaurant envoyé en paramètre
	 * @param restaurant - Restaurant
	 */
	public void afficherPlats(Restaurant restaurant) {	
		// Ajout de la section des plats
		sectionPlat.removeAll();
		Vector<String> liste = new Vector<String>();
		
		int i = 0;
		for (ItemMenu item : restaurant.getListePlats()) {
			liste.add(i, " $ "+item.getPrix()+" - "+item.getNom());
			i++;
		}
		// Ajout de la liste des plats à sélectionner
		listePlats = new JList(liste);
		listePlats.setLayoutOrientation(JList.VERTICAL);
		JScrollPane listePlatsScroller = new JScrollPane(listePlats);
		sectionListePlats = new JPanel(new GridLayout());
		sectionListePlats.setSize(this.getWidth()/3, this.getHeight()/2);
		sectionListePlats.add(listePlatsScroller);
		sectionPlat.add(sectionListePlats);
		
		// Fin de l'ajout de la liste des plats à sélectionner
		
			//  Ajout du bouton d'ajout et de suppression
		JPanel sectionBoutonsPlat = new JPanel();
		sectionBoutonsPlat.setLayout(new BoxLayout(sectionBoutonsPlat, BoxLayout.PAGE_AXIS));
		JButton boutonAjouter = new JButton("Ajouter");
		boutonAjouter.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (!(listePlats.isSelectionEmpty())) {
					String quantite = JOptionPane.showInputDialog("Combien en voulez-vous?", "1");
					if (quantite != null) {
						if (!quantite.matches("[1-9][0-9]*")) {
							JOptionPane.showMessageDialog(sectionPlat, "Vous ne pouvez entrer aucune autre information qu'un entier positif.");
						} else {
							EnregistrerCommande.ajouterItem(restaurantSelectionne.getListePlats().get(listePlats.getSelectedIndex()), Integer.parseInt(quantite), restaurantSelectionne);
						}
					}
				}
			}
		});
		JButton boutonRetirer = new JButton("Retirer");
		boutonRetirer.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (!(listePlatsSelectionnes.isSelectionEmpty())) {
					String quantite = JOptionPane.showInputDialog("Combien voulez-vous en retirer?", "1");
					if (quantite != null) {
						if (!quantite.matches("[1-9][0-9]*")) {
							JOptionPane.showMessageDialog(sectionPlat, "Vous ne pouvez entrer aucune autre information qu'un entier positif.");
						} else {
							EnregistrerCommande.retirerItem(restaurantSelectionne.getListePlats().get(listePlats.getSelectedIndex()), Integer.parseInt(quantite), restaurantSelectionne);
						}
					}
				}
			}
		});
		sectionBoutonsPlat.add(boutonAjouter);
		sectionBoutonsPlat.add(boutonRetirer);
		sectionPlat.add(sectionBoutonsPlat);
			// Fin de l'ajout du bouton d'ajout et de suppression
		
			// Ajout de la liste des plats sélectionnés
		Vector<String> platsSelectionnes = new Vector<String>();
		listePlatsSelectionnes = new JList(platsSelectionnes);
		listePlatsSelectionnes.setLayoutOrientation(JList.VERTICAL);
		sectionListePlatsSelectionnes = new JPanel(new GridLayout());
		modifierSelection(EnregistrerCommande.getListeItems());
		sectionPlat.add(sectionListePlatsSelectionnes);
			// Fin de l'ajout de la liste des plats sélectionnés
		// Fin de l'ajout de la section des plats
		
		// Ajout de la section addresse
		this.remove(sectionAdresse);
		if (sectionAdresse.getComponentCount() == 0) {
			sectionAdresse.removeAll();
			sectionAdresse.add(new JLabel("Adresse de livraison (ex: 20 norroy, Lorraine) : "));
			sectionAdresse.add(textFieldAdresse);
		}
		this.add(sectionAdresse);
		// Fin de l'ajout de la section adresse
		
		// Ajout de la section date et heure
		this.remove(sectionDateHeure);
		if (sectionDateHeure.getComponentCount() == 0) {
			sectionDateHeure.removeAll();
			sectionDateHeure.add(new JLabel("Date et heure de livraison : "));
			// Ajout de la section date
			sectionDateHeure.add(comboDate);
			// Fin de l'ajout de la section date
			// Ajout de la section heure
			sectionDateHeure.add(comboHeure);
			// Fin de l'ajout de la section heures
		}
		this.add(sectionDateHeure);
		// Fin de l'ajout de la section date et heure
		
		// Ajout de la section de confirmation
		this.remove(sectionConfirmation);
		if (sectionConfirmation.getComponentCount() == 0) {
			sectionConfirmation.removeAll();
			JButton boutonConfirmation = new JButton("Afficher la facture");
			boutonConfirmation.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if (EnregistrerCommande.afficherFacture(comboDate.getSelectedItem().toString(), comboHeure.getSelectedItem().toString(), textFieldAdresse.getText())) {
						fermerPanneau();
					}
				}
			});
			sectionConfirmation.add(boutonConfirmation);
		}
		this.add(sectionConfirmation);
		// Fin de l'ajout de la section de confirmation
		
		// Rafraichissement de la page principale complete
		this.revalidate();
	}
	
	/**
	 * Modifie la liste des items sélectionnés
	 * @param com - Commande
	 */
	public void modifierSelection(ArrayList<ItemDansCommande> listeItems) {
		sectionListePlatsSelectionnes.removeAll();
		
		// Ajout de la liste des plats sélectionnés
		Vector<String> platsSelectionnes = new Vector<String>();
		int i = 0;
		for (ItemDansCommande plat : listeItems) {
			platsSelectionnes.add(i, " " + plat.getQuantite()+" - "+plat.getItem().getNom()+" $ "+plat.getItem().getPrix()*plat.getQuantite());
			i++;
		}
		listePlatsSelectionnes = new JList(platsSelectionnes);
		listePlatsSelectionnes.setLayoutOrientation(JList.VERTICAL);
		JScrollPane listeSelectionScroller = new JScrollPane(listePlatsSelectionnes);
		sectionListePlatsSelectionnes.add(listeSelectionScroller);
		// Fin de l'ajout de la liste des plats sélectionnés
		
		sectionPlat.revalidate();
		this.revalidate();
	}
	
	/**
	 * Retire la section dans le panneau du client
	 * @param section - JPanel
	 */
	public void cacherSection(JPanel section) {
		this.remove(section);
	}
	
	/**
	 * Ajoute la section dans le panneau du client
	 * @param section
	 */
	public void afficherSection(JPanel section) {
		this.add(section);
	}
	
	/**
	 * Réinitialise le panneau du client
	 */
	public void update() {
		this.revalidate();
	}
	
	/**
	 * Appelle à modifier la liste des items sélectionnés
	 */
	public void update(Observable o, Object arg) {
		Commande commande = (Commande) o;
		modifierSelection(commande.getListeItems());
	}
	
	private void fermerPanneau() {
		this.removeAll();
		update();
	}
}